#include <iostream>
#include <thread>
#include <future>

/**
 * std::async(policy, func, ...) 异步调用函数任务
 * policy策略模式：
 *     std::launch::deferred在本线程执行
 *     std::launch::async创建新线程执行
 *     std::launch::deferred|std::launch::async系统自行选择
 * 
 * std::future<return-type>::get() 获取异步操作的结果，若结果未得出，则阻塞线程
*/

int taskAdd(int op1, int op2)
{
    return op1 + op2;
}

int main()
{
    // future模板参数与函数返回值类型相同
    std::future<int> result = std::async(std::launch::deferred, taskAdd, 11, 22); //在本线程执行
    int sum1 = result.get(); //想要获取结果时，才会执行异步任务taskAdd

    std::future<int> result = std::async(std::launch::async, taskAdd, 11, 22); //创建新线程执行
    int sum2 = result.get(); //std::async调用，就会创建新线程执行taskAdd，若结果未得出，则阻塞线程

    std::cout << "sum1: " << sum1 << ", sum2: " << sum2 << std::endl;

    return 0;
}